/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.modelo;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import util.JPAUtil;

/**
 *
 * @author Gilberto
 */
@Entity
@Table(name = "produto")
public class Produto implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @NotNull
    @Column(name = "ID")
    private Integer id;
    @Size(max = 14)
    @Column(name = "GTIN")
    private String gtin = "";
    @Size(max = 20)
    @Column(name = "CODIGO_INTERNO")
    private String codigoInterno = "";
    @Size(max = 100)
    @Column(name = "NOME")
    private String nome;
    @Lob
    @Size(max = 65535)
    @Column(name = "DESCRICAO")
    private String descricao;
    @Size(max = 30)
    @Column(name = "DESCRICAO_PDV")
    private String descricaoPdv;
    // @Max(value=?)  @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
    @Column(name = "VALOR_VENDA")
    private BigDecimal valorVenda = new BigDecimal(0);
    @Column(name = "QTD_ESTOQUE")
    private BigDecimal qtdEstoque = new BigDecimal(0);
    @Column(name = "QTD_ESTOQUE_ANTERIOR")
    private BigDecimal qtdEstoqueAnterior = new BigDecimal(0);
    @Column(name = "ESTOQUE_MIN")
    private BigDecimal estoqueMin = new BigDecimal(0);
    @Column(name = "ESTOQUE_MAX")
    private BigDecimal estoqueMax = new BigDecimal(0);
    @Column(name = "IAT")
    private Character iat;
    @Column(name = "IPPT")
    private Character ippt;
    @Size(max = 8)
    @Column(name = "NCM")
    private String ncm;
    @Size(max = 2)
    @Column(name = "TIPO_ITEM_SPED")
    private String tipoItemSped;
    @Column(name = "DATA_ESTOQUE")
    @Temporal(TemporalType.DATE)
    private Date dataEstoque;
    @Size(max = 8)
    @Column(name = "HORA_ESTOQUE")
    private String horaEstoque;
    @Column(name = "TAXA_IPI")
    private BigDecimal taxaIpi = new BigDecimal(0);
    @Column(name = "TAXA_ISSQN")
    private BigDecimal taxaIssqn = new BigDecimal(0);
    @Column(name = "TAXA_PIS")
    private BigDecimal taxaPis = new BigDecimal(0);
    @Column(name = "TAXA_COFINS")
    private BigDecimal taxaCofins = new BigDecimal(0);
    @Column(name = "TAXA_ICMS")
    private BigDecimal taxaIcms;
    @Size(max = 3)
    @Column(name = "CST")
    private String cst;
    @Size(max = 4)
    @Column(name = "CSOSN")
    private String csosn;
    @Size(max = 10)
    @Column(name = "TOTALIZADOR_PARCIAL")
    private String totalizadorParcial;
    @Size(max = 4)
    @Column(name = "ECF_ICMS_ST")
    private String ecfIcmsSt;
    @Column(name = "CODIGO_BALANCA")
    private Integer codigoBalanca;
    @Column(name = "PAF_P_ST")
    private Character pafPSt;
    @Size(max = 32)
    @Column(name = "HASH_TRIPA")
    private String hashTripa;
    @Column(name = "HASH_INCREMENTO")
    private Integer hashIncremento;
    @Column(name = "VALOR_COMPRA")
    private Long valorCompra;
    @Column(name = "MARGEM")
    private Long margem;
    @Column(name = "EXCLUIDO")
    private Character excluido;
    @JoinColumn(name = "id_subgrupo", referencedColumnName = "id")
    @ManyToOne(optional = false)
    private Subgrupo idSubgrupo = new Subgrupo();
    @JoinColumn(name = "id_grupo", referencedColumnName = "id")
    @ManyToOne(optional = false)
    private Grupo idGrupo = new Grupo();
    @JoinColumn(name = "ID_UNIDADE_PRODUTO", referencedColumnName = "ID")
    @ManyToOne(optional = false)
    private UnidadeProduto idUnidadeProduto = new UnidadeProduto();

    public Produto() {
    }

    public Produto(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getGtin() {
        return gtin;
    }

    public void setGtin(String gtin) {
        this.gtin = gtin;
    }

    public String getCodigoInterno() {
        return codigoInterno;
    }

    public void setCodigoInterno(String codigoInterno) {
        this.codigoInterno = codigoInterno;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public String getDescricaoPdv() {
        return descricaoPdv;
    }

    public void setDescricaoPdv(String descricaoPdv) {
        this.descricaoPdv = descricaoPdv;
    }

    public BigDecimal getValorVenda() {
        return valorVenda;
    }

    public void setValorVenda(BigDecimal valorVenda) {
        this.valorVenda = valorVenda;
    }

    public BigDecimal getQtdEstoque() {
        return qtdEstoque;
    }

    public void setQtdEstoque(BigDecimal qtdEstoque) {
        this.qtdEstoque = qtdEstoque;
    }

    public BigDecimal getQtdEstoqueAnterior() {
        return qtdEstoqueAnterior;
    }

    public void setQtdEstoqueAnterior(BigDecimal qtdEstoqueAnterior) {
        this.qtdEstoqueAnterior = qtdEstoqueAnterior;
    }

    public BigDecimal getEstoqueMin() {
        return estoqueMin;
    }

    public void setEstoqueMin(BigDecimal estoqueMin) {
        this.estoqueMin = estoqueMin;
    }

    public BigDecimal getEstoqueMax() {
        return estoqueMax;
    }

    public void setEstoqueMax(BigDecimal estoqueMax) {
        this.estoqueMax = estoqueMax;
    }

    public Character getIat() {
        return iat;
    }

    public void setIat(Character iat) {
        this.iat = iat;
    }

    public Character getIppt() {
        return ippt;
    }

    public void setIppt(Character ippt) {
        this.ippt = ippt;
    }

    public String getNcm() {
        return ncm;
    }

    public void setNcm(String ncm) {
        this.ncm = ncm;
    }

    public String getTipoItemSped() {
        return tipoItemSped;
    }

    public void setTipoItemSped(String tipoItemSped) {
        this.tipoItemSped = tipoItemSped;
    }

    public Date getDataEstoque() {
        return dataEstoque;
    }

    public void setDataEstoque(Date dataEstoque) {
        this.dataEstoque = dataEstoque;
    }

    public String getHoraEstoque() {
        return horaEstoque;
    }

    public void setHoraEstoque(String horaEstoque) {
        this.horaEstoque = horaEstoque;
    }

    public BigDecimal getTaxaIpi() {
        return taxaIpi;
    }

    public void setTaxaIpi(BigDecimal taxaIpi) {
        this.taxaIpi = taxaIpi;
    }

    public BigDecimal getTaxaIssqn() {
        return taxaIssqn;
    }

    public void setTaxaIssqn(BigDecimal taxaIssqn) {
        this.taxaIssqn = taxaIssqn;
    }

    public BigDecimal getTaxaPis() {
        return taxaPis;
    }

    public void setTaxaPis(BigDecimal taxaPis) {
        this.taxaPis = taxaPis;
    }

    public BigDecimal getTaxaCofins() {
        return taxaCofins;
    }

    public void setTaxaCofins(BigDecimal taxaCofins) {
        this.taxaCofins = taxaCofins;
    }

    public BigDecimal getTaxaIcms() {
        return taxaIcms;
    }

    public void setTaxaIcms(BigDecimal taxaIcms) {
        this.taxaIcms = taxaIcms;
    }

    public String getCst() {
        return cst;
    }

    public void setCst(String cst) {
        this.cst = cst;
    }

    public String getCsosn() {
        return csosn;
    }

    public void setCsosn(String csosn) {
        this.csosn = csosn;
    }

    public String getTotalizadorParcial() {
        return totalizadorParcial;
    }

    public void setTotalizadorParcial(String totalizadorParcial) {
        this.totalizadorParcial = totalizadorParcial;
    }

    public String getEcfIcmsSt() {
        return ecfIcmsSt;
    }

    public void setEcfIcmsSt(String ecfIcmsSt) {
        this.ecfIcmsSt = ecfIcmsSt;
    }

    public Integer getCodigoBalanca() {
        return codigoBalanca;
    }

    public void setCodigoBalanca(Integer codigoBalanca) {
        this.codigoBalanca = codigoBalanca;
    }

    public Character getPafPSt() {
        return pafPSt;
    }

    public void setPafPSt(Character pafPSt) {
        this.pafPSt = pafPSt;
    }

    public String getHashTripa() {
        return hashTripa;
    }

    public void setHashTripa(String hashTripa) {
        this.hashTripa = hashTripa;
    }

    public Integer getHashIncremento() {
        return hashIncremento;
    }

    public void setHashIncremento(Integer hashIncremento) {
        this.hashIncremento = hashIncremento;
    }

    public Long getValorCompra() {
        return valorCompra;
    }

    public void setValorCompra(Long valorCompra) {
        this.valorCompra = valorCompra;
    }

    public Long getMargem() {
        return margem;
    }

    public void setMargem(Long margem) {
        this.margem = margem;
    }

    public Character getExcluido() {
        return excluido;
    }

    public void setExcluido(Character excluido) {
        this.excluido = excluido;
    }

    public Subgrupo getIdSubgrupo() {
        return idSubgrupo;
    }

    public void setIdSubgrupo(Subgrupo idSubgrupo) {
        this.idSubgrupo = idSubgrupo;
    }

    public Grupo getIdGrupo() {
        return idGrupo;
    }

    public void setIdGrupo(Grupo idGrupo) {
        this.idGrupo = idGrupo;
    }

    public UnidadeProduto getIdUnidadeProduto() {
        return idUnidadeProduto;
    }

    public void setIdUnidadeProduto(UnidadeProduto idUnidadeProduto) {
        this.idUnidadeProduto = idUnidadeProduto;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Produto)) {
            return false;
        }
        Produto other = (Produto) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "br.com.modelo.Produto[ id=" + id + " ]";
    }

    public static List<Produto> retornaProdutos() {
        EntityManager em = JPAUtil.retornarFabrica().createEntityManager();
        Query q = em.createQuery("FROM Produto f WHERE f.excluido = 'N'");
        List<Produto> list = q.getResultList();
        em.close();
        return list;
    }

    public Produto salvar() {
        return (Produto) JPAUtil.mergeObjeto(this);
    }

    public void excluir() {
        JPAUtil.delete(this);
    }

    public static List<Produto> retornaBusca(String campoBusca) {
        EntityManager em = JPAUtil.retornarFabrica().createEntityManager();
        Query q = em.createQuery("FROM Produto f WHERE "
                + "f.gtin LIKE ? "
                + "OR f.codigoInterno LIKE ? "
                + "OR f.descricaoPdv LIKE ? "
                + "OR f.descricao LIKE ? "
                + "AND f.excluido = 'N'");
        for (int x = 1; x <= 4; x++) {
            q.setParameter(x, "%" + campoBusca.toString() + "%");
        }
        List<Produto> list = q.getResultList();
        em.close();
        return list;
    }

    public static Produto retornaProdutoPorGtinOuCodInterno(String gtin, String codInterno) {
        EntityManager em = JPAUtil.retornarFabrica().createEntityManager();
        Query q = em.createQuery("FROM Produto f WHERE "
                + "f.gtin = ? "
                + "OR f.codigoInterno = ? "
                + "AND f.excluido = 'N'");
        q.setParameter(1, gtin);
        q.setParameter(2, codInterno);
        Produto retorno;
        try {
            retorno = (Produto) q.getSingleResult();
            em.close();
            return retorno;
        } catch (javax.persistence.NoResultException e) {
            em.close();
            return null;
        }
    }

    public static Produto retornaProdutoPorGtin(String gtin) {
        EntityManager em = JPAUtil.retornarFabrica().createEntityManager();
        Query q = em.createQuery("FROM Produto f WHERE f.gtin = ? AND f.excluido = 'N'");
        q.setParameter(1, gtin);
        Produto retorno;
        try {
            retorno = (Produto) q.getSingleResult();
            em.close();
            return retorno;
        } catch (javax.persistence.NoResultException e) {
            em.close();
            return null;
        }
    }

    public static Produto retornaProdutoPorCodigoInterno(String codInter) {
        EntityManager em = JPAUtil.retornarFabrica().createEntityManager();
        Query q = em.createQuery("FROM Produto f WHERE f.codigoInterno = ? AND f.excluido = 'N'");
        q.setParameter(1, codInter);
        Produto retorno;
        try {
            retorno = (Produto) q.getSingleResult();
            em.close();
            return retorno;
        } catch (javax.persistence.NoResultException e) {
            em.close();
            return null;
        }
    }

    public Produto salvarCaixas(String ip) {
        return (Produto) JPAUtil.mergeObjetoCaixa(ip, this);
    }
}
